/*!
 * @file Buffer.inl
 * @author Rocco Martino
 */
/***************************************************************************
 *   Copyright (C) 2010 - 2013 by Rocco Martino                            *
 *   martinorocco@gmail.com                                                *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU Lesser General Public License as        *
 *   published by the Free Software Foundation; either version 2.1 of the  *
 *   License, or (at your option) any later version.                       *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU Lesser General Public License for more details.                   *
 *                                                                         *
 *   You should have received a copy of the GNU Lesser General Public      *
 *   License along with this program; if not, write to the                 *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#ifndef _PSOUND_BUFFER_INL
#define _PSOUND_BUFFER_INL

/* ======================================================================= */
/* ....................................................................... */
#include <cstdio>
#include <cstdlib>
#include <cstring>
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline unsigned short int
pSound::Buffer::getBitsPerSample(void) const
{
    return m_bits_per_sample ;
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline unsigned int
pSound::Buffer::getFrequency(void) const
{
    return m_sample_rate ;
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline unsigned short int
pSound::Buffer::getNumChannels(void) const
{
    return m_num_channels ;
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline unsigned int
pSound::Buffer::getDataSize(void) const
{
    return m_data_size ;
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline void*
pSound::Buffer::getData(void) const
{
    return m_data ;
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline void*
pSound::Buffer::releaseData(void)
{
    void*   data = m_data ;
    m_data = NULL ;
    return data ;
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline ALuint
pSound::Buffer::getBuffer(void) const
{
    return m_buffer ;
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline void
pSound::Buffer::setBitsPerSample(unsigned short int bps)
{
    if( bps != m_bits_per_sample ) {
        m_bits_per_sample = bps ;
        m_dirty = true ;

        computeDuration() ;
    }
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline void
pSound::Buffer::setFrequency(unsigned int freq)
{
    if( freq != m_sample_rate ) {
        m_sample_rate = freq ;
        m_dirty = true ;

        computeDuration() ;
    }
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline void
pSound::Buffer::setNumChannels(unsigned short int n)
{
    if( n != m_num_channels ) {
        m_num_channels = n ;
        m_dirty = true ;

        computeDuration() ;
    }
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline void
pSound::Buffer::setDataSize(unsigned int s)
{
    if( s != m_data_size ) {
        m_data_size = s ;
        m_dirty = true ;

        computeDuration() ;
    }
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline void
pSound::Buffer::setData(void* d)
{
    if( d != m_data ) {
        free(m_data) ;
        m_data = d ;
    }


    m_dirty = true ;
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline const std::string&
pSound::Buffer::getSoundFileName(void) const
{
    return m_file_name ;
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline void
pSound::Buffer::setSoundFileName(const std::string& file_name)
{
    m_file_name = file_name ;
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline float
pSound::Buffer::getDuration(void) const
{
    return m_duration ;
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline void
pSound::Buffer::computeDuration(void)
{
    m_duration = m_data_size * 8.0 / (m_num_channels * m_sample_rate * m_bits_per_sample) ;
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline void
pSound::Buffer::setReleaseMemoryAfterApply(bool release)
{
    m_release_data = release ;
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline bool
pSound::Buffer::getReleaseMemoryAfterApply(void) const
{
    return m_release_data ;
}
/* ....................................................................... */
/* ======================================================================= */




/* ======================================================================= */
/* ....................................................................... */
inline void
pSound::Buffer::freeData(void)
{
    free(m_data) ;
    m_data = NULL ;
}
/* ....................................................................... */
/* ======================================================================= */




#endif /* _PSOUND_BUFFER_INL */
